# 导入Flask框架和相关模块
from flask import Flask, redirect, url_for, render_template, request
from flask_sqlalchemy import SQLAlchemy

# 创建Flask应用实例
app = Flask(__name__)
# 配置SQLite数据库URI
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///inspiration.db'
# 禁用SQLAlchemy事件系统，提高性能
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 创建SQLAlchemy数据库实例
db = SQLAlchemy(app)

# 发布平台模型类
class PublishingPlatform(db.Model):
    # 主键ID
    id = db.Column(db.Integer, primary_key=True)
    # 平台名称，唯一不可重复
    name = db.Column(db.String(50), unique=True)

# 写作风格模型类
class WritingStyle(db.Model):
    # 主键ID
    id = db.Column(db.Integer, primary_key=True)
    # 风格名称
    style_name = db.Column(db.String(50))

# 灵感记录模型类
class InspirationRecord(db.Model):
    # 主键ID
    id = db.Column(db.Integer, primary_key=True)
    # 文章标题
    title = db.Column(db.String(100))
    # 关联发布平台的外键
    platform_id = db.Column(db.Integer, db.ForeignKey('publishing_platform.id'))
    # 关联写作风格的外键
    style_id = db.Column(db.Integer, db.ForeignKey('writing_style.id'))
    # 文章提示/内容
    prompt = db.Column(db.Text)
    # 字数统计
    word_count = db.Column(db.Integer)
    # 状态：暂存或已发布
    status = db.Column(db.String(20))  # 暂存/已发布
    # 创建时间，默认为当前时间
    create_time = db.Column(db.DateTime, default=db.func.now())
    
    # 添加关系属性
    platform = db.relationship('PublishingPlatform', backref='inspirations')
    style = db.relationship('WritingStyle', backref='inspirations')
# 将AIPrompt类的定义移到此处，确保在使用前已定义
class AIPrompt(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    content = db.Column(db.Text)
    category = db.Column(db.String(50))
    create_time = db.Column(db.DateTime, default=db.func.now())

# 首页路由，重定向到任务列表页面
@app.route('/')
def index():
    return redirect(url_for('task_list'))

# 灵感表单页面路由
# GET方法：显示灵感记录表单
@app.route('/inspiration', methods=['GET'])
def inspiration_form():
    # 获取所有发布平台
    platforms = PublishingPlatform.query.all()
    # 获取所有写作风格
    styles = WritingStyle.query.all()
    # 渲染表单模板，并传入平台和风格数据
    return render_template('inspiration_form.html', platforms=platforms, styles=styles)

# 保存灵感记录路由
# POST方法：处理表单提交
@app.route('/save', methods=['POST'])
def save_inspiration():
    try:
        # 创建新的灵感记录对象
        new_record = InspirationRecord(
            title=request.form['title'],  # 获取表单中的标题
            platform_id=request.form['platform'],  # 获取选择的平台ID
            style_id=request.form['style'],  # 获取选择的风格ID
            prompt=request.form['prompt'],  # 获取提示内容
            word_count=request.form.get('word_count'),  # 获取字数(可选)
            status=request.form['status']  # 获取状态(暂存/已发布)
        )
        # 添加到数据库会话
        db.session.add(new_record)
        # 提交事务
        db.session.commit()
        # 重定向到任务列表页面
        return redirect(url_for('task_list'))
    except Exception as e:
        db.session.rollback()
        return f"保存失败: {str(e)}", 400

# 任务列表页面路由
@app.route('/tasks')
def task_list():
    # 获取所有发布平台
    platforms = PublishingPlatform.query.all()
    # 获取所有写作风格
    styles = WritingStyle.query.all()
    # 查询所有灵感记录，关联平台和风格表，并按创建时间降序排列
    tasks = InspirationRecord.query\
        .join(PublishingPlatform)\
        .join(WritingStyle)\
        .order_by(InspirationRecord.create_time.desc())\
        .all()
    # 渲染任务列表模板，并传入平台、风格和任务数据
    return render_template('task_list.html', 
        platforms=platforms, 
        styles=styles,
        tasks=tasks
    )

# 初始化测试数据
with app.app_context():
    # 创建所有数据库表
    db.create_all()
    
    # 如果发布平台表为空，则初始化默认平台数据
    if not PublishingPlatform.query.first():
        platforms = ['微信公众号', '知乎专栏', '小红书']
        for name in platforms:
            db.session.add(PublishingPlatform(name=name))
    
    # 如果写作风格表为空，则初始化默认风格数据
    if not WritingStyle.query.first():
        styles = ['专业严谨', '轻松幽默', '故事叙述']
        for name in styles:
            db.session.add(WritingStyle(style_name=name))
    
    # 如果AI Prompt表为空，则初始化默认数据
    if not AIPrompt.query.first():
        prompts = [
            {'name': '专业文章', 'content': '请以专业角度撰写...', 'category': '专业'},
            {'name': '幽默风格', 'content': '请用幽默风趣的语言...', 'category': '幽默'}
        ]
        for p in prompts:
            db.session.add(AIPrompt(name=p['name'], content=p['content'], category=p['category']))
        db.session.commit()
    
    # 提交数据库事务
    db.session.commit()

# 发布平台管理路由
@app.route('/platforms')
def platform_management():
    platforms = PublishingPlatform.query.all()
    return render_template('platform_management.html', platforms=platforms)

# 文案风格管理路由
@app.route('/styles')
def style_management():
    styles = WritingStyle.query.all()
    return render_template('style_management.html', styles=styles)

# AI prompt管理路由
@app.route('/prompts')
def prompt_management():
    prompts = AIPrompt.query.all()  # 需要先创建AIPrompt模型
    return render_template('prompt_management.html', prompts=prompts)

# 主程序入口
if __name__ == '__main__':
    # 启动Flask开发服务器，开启调试模式
    app.run(debug=True)


class AIPrompt(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    content = db.Column(db.Text)
    category = db.Column(db.String(50))
    create_time = db.Column(db.DateTime, default=db.func.now())